#include "config.h"

namespace xxXPCSC
{
    // 类里静态变量必须在外面声明
    //Config::ConfigVarMap& Config::GetDatas();

    // yaml拼接与转换
    // std::pair主要的作用是将两个数据组合成一个数据
    static void ListAllMember(const std::string &prefix, const YAML::Node &node, std::list<std::pair<std::string, const YAML::Node>> &output)
    {
        if (prefix.find_first_not_of("abcdefghijklmnopqrstuvwxyz._-0123456789") != std::string::npos)
        {
            XXXPCSC_LOG_ERROR(XXXPCSC_LOG_ROOT()) << "Config invalid name::" << prefix << ":" << node;
            return;
        }
        output.push_back(std::make_pair(prefix, node));
        // 分层之后下一层还是map 则遍历
        if (node.IsMap())
        {
            for (auto it = node.begin(); it != node.end(); it++)
            {
                ListAllMember(prefix.empty() ? it->first.Scalar() : prefix + "." + it->first.Scalar(), it->second, output);
            }
        }
    }

    ConfigVarBase::ptr Config::LookupBase(const std::string &name)
    {
        //此处对s_datas作了修改
        auto it =GetDatas().find(name);
        return it == GetDatas().end() ? nullptr : it->second;
    }
    // 加载yaml配置文件
    void Config::LoadFromYaml(const YAML::Node &root)
    {
        std::list<std::pair<std::string, const YAML::Node>> all_nodes;
        //此处必须为"" 中间不能有空格否则会匹配失败
        ListAllMember("", root, all_nodes);
        for (auto &i : all_nodes){
            std::string key = i.first;
            if (key.empty())
                continue;

            std::transform(key.begin(), key.end(), key.begin(), ::tolower); // 强制转为小写
            ConfigVarBase::ptr var = LookupBase(key);

            if (var){
                if (i.second.IsScalar()){
                    var->fromString(i.second.Scalar());
                }else{
                    std::stringstream ss;
                    ss << i.second;
                    var->fromString(ss.str());
                }
            }
        }
    }

}